
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>分库分表后是怎么把数据存到数据库中的 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>分库分表后是怎么把数据存到数据库中的 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">当业务量剧增时，为什么需要考虑对数据库进行“分库”？文档提到了哪两个核心原因？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. 磁盘存储瓶颈：随着业务量剧增，MySQL单机的磁盘容量可能会被占满。分库可以将数据分散到多个数据库，降低单个数据库的磁盘使用率。 2. 并发连接支撑：数据库的连接数是有限的，在高并发场景下，单机MySQL无法承受大量请求。通过分库，可以将不同业务模块（如订单、用户、商品）的访问压力分散到不同的数据库中。</div>
          </div>
          <div class="card-source">来源: 为什么需要分库</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">为什么当数据表的记录超过一千万时，即使SQL查询命中了索引，性能也可能会明显下降？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为数据库索引通常采用B+树结构。当数据量达到千万级别时，B+树的高度会增加，这导致查询时需要遍历更多层级，从而使得查询速度变慢。</div>
          </div>
          <div class="card-source">来源: 为什么需要分表</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">请解释什么是“range范围”分库分表策略，并举例说明。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">“range范围”策略是根据某个字段的范围来划分数据。例如，可以按表的主键ID范围划分（如0-1000万的数据在一个表，1000-2000万在另一个表），或者按时间范围划分（如不同年月的订单数据存放在不同的表中）。</div>
          </div>
          <div class="card-source">来源: 分库分表策略 - range范围</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">“hash取模”分库分表策略是如何工作的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">“hash取模”策略是选择一个指定的路由键（通常是user_id或订单id），对分表的总数进行取模运算，然后根据运算结果将数据分散到对应的表中。例如，id=3的数据，对4张分表取模（3 % 4），结果为3，因此数据会被存放到第三张表中。</div>
          </div>
          <div class="card-source">来源: 分库分表策略 - hash取模</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在决定采用分库还是分表时，文档给出的核心指导原则是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">核心指导原则是：如果系统面临高并发问题，应优先考虑分库；如果系统面临数据量过大的问题，应优先考虑分表；如果高并发和大数据量问题同时存在，则需要既分库也分表。</div>
          </div>
          <div class="card-source">来源: 应该是选择分库还是分表呢？</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">实施分库分表可以为系统带来哪些主要优势？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">分库分表的主要优势包括：1. 性能提升：将大表拆分为小表，提高查询和写入性能。2. 可用性提高：分散数据负载，减轻单库压力，提升系统稳定性和可用性。3. 横向扩展：方便通过增加更多数据库和表来实现系统扩展。4. 灵活性：可根据业务需求选择不同的分片策略。</div>
          </div>
          <div class="card-source">来源: 分库分表的主要优势</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">分库分表架构会带来哪些主要的挑战和缺点？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">主要缺点包括：1. 数据一致性挑战：引入了数据同步和分布式事务的复杂性。2. 跨库查询复杂性：跨多个数据库的查询可能导致性能下降，需要精心设计查询策略。3. 分布式事务管理：涉及多个数据库的操作，需要有效的分布式事务管理方案来保证一致性。</div>
          </div>
          <div class="card-source">来源: 分库分表的缺点</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">架构</div>
          <div class="card-question">文档是如何将微服务架构与数据库的“分库”策略联系起来的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">架构</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">微服务架构通过将不同业务模块（如订单、用户、商品）拆分成多个独立应用来应对高并发。与此相对应，“分库”策略也将单个数据库拆分成多个功能模块的数据库（如订单库、用户库、商品库），从而将不同应用的读写压力分散到各自的数据库，以支撑微服务架构。</div>
          </div>
          <div class="card-source">来源: 为什么需要分库</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">根据文档，通常在什么情况下需要考虑进行“分表”？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当单表的数据量太大，导致SQL查询变慢时，就需要考虑分表。特别是当一个查询SQL没有命中索引时，千万级数据量的表可能会拖垮整个数据库。即使命中了索引，当数据量超过一千万时，查询性能也会明显变慢。</div>
          </div>
          <div class="card-source">来源: 为什么需要分表</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
